package com.itheima.springbootwebtlias.mapper;

import com.itheima.springbootwebtlias.pojo.Emp;
import com.itheima.springbootwebtlias.pojo.EmpQueryParam;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

@Mapper
public interface EmpMapper {

    // 多条件查询
    /*@Select("select e.*, d.name from emp e left join dept d on e.dept_id = d.id " +
            "where e.name like concat('%',${name},'%') and gender = #{gender} and entry_date between #{begin} and #{end}")*/
    List<Emp> selectByCondition(EmpQueryParam queryParam);

    void insert(Emp emp);

    // 根据id批量删除员工信息
    void deleteBatchById(List<Integer> ids);

    // 根据id查询员工信息
    @Select("select * from emp where id = #{id}")
    Emp selectById(Integer id);

    // 根据id查询员工信息详情，并且查询员工对应的工作经历
    Emp selectByIdAndExprs(Integer id);

    //  更新员工信息
    void update(Emp emp);

    // 根据部门id查询员工数量
    @Select("select count(*) from emp where dept_id = #{id}")
    Integer selectByDeptId(Integer id);

    // 根据职位查询员工数量
    @MapKey("name")
    List<Map> jobCount();

    // 根据性别查询员工数量
    @MapKey("name")
    List<Map> genderCount();

    //  查询所有员工信息
    @Select("select * from emp")
    List<Emp> queryAll();

    // 根据用户名查询员工信息/员工登录
    @Select("select * from emp where username = #{username}")
    Emp selectByUsername(String username);

    /**
     * Service分层插件底层原理
     *

        // 一、mybatis框架实现持久层开发；
        class EmpMapperProxy implements EmpMapper{

            List<Emp> selectByCondition(EmpQueryParam queryParam){
                // 1.从数据库连接池中获取连接对象
                // 2.从当前方法上解析出SQL语句
                // 3.使用反射设置参数
                // 4.获取PreparedStatement，发送SQL语句
                // 5.使用反射解析结果数据List<Emp>集合中
            }

        }

        // 二、mybatis创建的持久层实现类对象，存储到ioc容器中了
        // 三、业务层service中
           1.在业务层配置了分页插件
           2.从容器中获取持久层对象EmpMapperProxy查询数据时被mybatis拦截器拦截，功能增强，动态代理
           3.mybatis拦截器功能增强：
             1.根据页码，计算起始位置
             2.获取原方法的SQL语句，追加limit 起始位置，页码
             3.单独发送select count(*) sql语句，查询总记录数
             4.将查询结果封装到Page对象，返回

     */


}
